/*
 * ManipulacionConsultas.java
 *
 * Created on 23 de mayo de 2007, 03:44 PM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package ig.util;


import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Date;
import java.util.StringTokenizer;

/**
 *
 * @author jsanchez
 */
public class ManipulacionConsultas {
    
    /** Creates a new instance of ManipulacionConsultas */
    public ManipulacionConsultas() {
        
    }
    
//    public static void main(String[] arg){
//        System.out.println((new java.sql.Timestamp(new java.util.Date().getTime())).toString().substring(0,10));
//    }
    public String[] getColumName(Connection conn,String Qeuery)throws Exception{
        int x1 = 0 ;
        int x2 = 0 ;
        ResultSet r=null;
        PreparedStatement prep = null;
        java.sql.Timestamp fechaCorte=new java.sql.Timestamp(new java.util.Date().getTime());
        try {
            String consultaOriginal = getQUERY(Qeuery,false);
            String QUERY=getQUERY(Qeuery,true);
            
            if(QUERY.contains("-FECHA_CORTE") || QUERY.contains("-FECHA_CORTE_DIA") || QUERY.contains("-FECHA_CORTE_MES") || QUERY.contains("-FECHA_CORTE_ANIO"))
                QUERY=remplazarTabla(QUERY,fechaCorte.toString().substring(0,10));
            
            prep = conn.prepareStatement(QUERY);
            int ocurrencias=this.getOcurrencias(Qeuery);
            if (ocurrencias-1 == 1) {
                x1 = consultaOriginal.indexOf("_FECHA_INICIAL");
                x2 = consultaOriginal.indexOf("_FECHA_CORTE");
                if((x1<x2 && x1>0) || (x1>0 && x2<0)){
                    prep.setDate(1,new java.sql.Date(fechaCorte.getTime()));
                    consultaOriginal = consultaOriginal.replaceFirst("_FECHA_INICIAL","?");//calculada
                }else{
                    prep.setDate(1,new java.sql.Date(fechaCorte.getTime()));
                    consultaOriginal = consultaOriginal.replaceFirst("_FECHA_CORTE","?");//fecha digitada
                }
            }else{
                for (int i=1 ; i<=ocurrencias-1 ; i++){
                    x1 = consultaOriginal.indexOf("_FECHA_INICIAL");
                    x2 = consultaOriginal.indexOf("_FECHA_CORTE");
                    if((x1<x2 && x1>0) || (x1>0 && x2<0)){
                        prep.setDate(i,new java.sql.Date(fechaCorte.getTime()));
                        consultaOriginal = consultaOriginal.replaceFirst("_FECHA_INICIAL","?");//calculada
                    }else{
                        prep.setDate(i,new java.sql.Date(fechaCorte.getTime()));
                        consultaOriginal = consultaOriginal.replaceFirst("_FECHA_CORTE","?");//fecha digitada
                    }
                }
            }
            r=prep.executeQuery();
            int numCols = r.getMetaData().getColumnCount();
            String[] resultados = new String[numCols];            
            for (int i = 1; i <=numCols ; i++) {
                resultados[i-1]=r.getMetaData().getColumnName(i);
            }
            return resultados;
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        }finally{
            try {prep.close();} catch (Exception e) {}
            try {r.close();} catch (Exception e) {}
        }
        
    }
    public ArrayList ejecutarConsulta(Connection conn,String Qeuery) throws Exception{
        int x1 = 0 ;
        int x2 = 0 ;
        PreparedStatement prep = null;
        java.sql.Timestamp fechaCorte=new java.sql.Timestamp(new java.util.Date().getTime());
        try {
            String consultaOriginal = getQUERY(Qeuery,false);
            String QUERY=getQUERY(Qeuery,true);
            
            if(QUERY.contains("-FECHA_CORTE") || QUERY.contains("-FECHA_CORTE_DIA") || QUERY.contains("-FECHA_CORTE_MES") || QUERY.contains("-FECHA_CORTE_ANIO"))
                QUERY=remplazarTabla(QUERY,fechaCorte.toString().substring(0,10));
            
            prep = conn.prepareStatement(QUERY);
            int ocurrencias=this.getOcurrencias(Qeuery);
            if (ocurrencias-1 == 1) {
                x1 = consultaOriginal.indexOf("_FECHA_INICIAL");
                x2 = consultaOriginal.indexOf("_FECHA_CORTE");
                if((x1<x2 && x1>0) || (x1>0 && x2<0)){
                    prep.setDate(1,new java.sql.Date(fechaCorte.getTime()));
                    consultaOriginal = consultaOriginal.replaceFirst("_FECHA_INICIAL","?");//calculada
                }else{
                    prep.setDate(1,new java.sql.Date(fechaCorte.getTime()));
                    consultaOriginal = consultaOriginal.replaceFirst("_FECHA_CORTE","?");//fecha digitada
                }
            }else{
                for (int i=1 ; i<=ocurrencias-1 ; i++){
                    x1 = consultaOriginal.indexOf("_FECHA_INICIAL");
                    x2 = consultaOriginal.indexOf("_FECHA_CORTE");
                    if((x1<x2 && x1>0) || (x1>0 && x2<0)){
                        prep.setDate(i,new java.sql.Date(fechaCorte.getTime()));
                        consultaOriginal = consultaOriginal.replaceFirst("_FECHA_INICIAL","?");//calculada
                    }else{
                        prep.setDate(i,new java.sql.Date(fechaCorte.getTime()));
                        consultaOriginal = consultaOriginal.replaceFirst("_FECHA_CORTE","?");//fecha digitada
                    }
                }
            }
            ArrayList resultados = new ArrayList();
            ResultSet r=prep.executeQuery();
            int numCols = r.getMetaData().getColumnCount();
            while(r.next()){
                Object[] registro = new Object[numCols];
                for (int i=0; i<numCols; i++){
                    registro[i] = r.getObject(i+1);
                }
                resultados.add( registro );
            }
            return resultados;
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        }finally{
            try {prep .close();} catch (Exception e) {}
        }
    }
    private String remplazarTabla(String QUERY,String fechaCortada) {
        Integer dia=java.sql.Date.valueOf(fechaCortada).getDate();
        Integer mes=java.sql.Date.valueOf(fechaCortada).getMonth();
        Integer anio=java.sql.Date.valueOf(fechaCortada).getYear();
//        dia++;
        mes++;
        anio=anio+1900;
        //if(dia<=9)
        //    QUERY=QUERY.replaceAll("-FECHA_CORTE_DIA","0"+dia.toString());
        //else
            QUERY=QUERY.replaceAll("-FECHA_CORTE_DIA",dia.toString());
        
        if(mes<=9)
            QUERY=QUERY.replaceAll("-FECHA_CORTE_MES","0"+mes.toString());
        else
            QUERY=QUERY.replaceAll("-FECHA_CORTE_MES",mes.toString());
        
        QUERY=QUERY.replaceAll("-FECHA_CORTE_ANIO",anio.toString());
        QUERY=QUERY.replaceAll("-FECHA_CORTE",this.getFecha(fechaCortada));
        return QUERY;
    }
    
    private String getFecha(String _fecha) {
        String fecha="";
        StringTokenizer token=null;
        if(_fecha.contains("/"))
            token=new StringTokenizer(_fecha.trim(),"/");
        else if(_fecha.contains("-"))
            token=new StringTokenizer(_fecha.trim(),"-");
        
        while(token!=null && token.hasMoreTokens()) {
            fecha=fecha+token.nextToken();
        }
        return fecha;
    }
    
    private int getOcurrencias(String QUERY){
        return getQUERY(QUERY,false).replace("_FECHA_CORTE","@").split("@").length;
    }
    
    private String getQUERY(String QUERY,boolean b) {
        String sinPeso="";
        String sinArroba="";
        String _QUERY="";
        
        StringTokenizer tokenPeso= new StringTokenizer(QUERY,"$");
        if(tokenPeso.hasMoreTokens()){
            sinPeso=tokenPeso.nextToken().toString();
        }
        
        if(QUERY.contains("$")){
            while(tokenPeso.hasMoreTokens()){
                sinPeso=sinPeso+"_";
                String TEMP=tokenPeso.nextToken().toString();
                for (int i = 0; i < TEMP.getBytes().length; i++) {
                    if(!TEMP.substring(i,i+1).equals("{"))
                        if(!TEMP.substring(i,i+1).equals("}")){
                        sinPeso=sinPeso+TEMP.substring(i,i+1);
                        }else{
                        sinPeso=sinPeso+TEMP.substring(i+1,TEMP.getBytes().length);
                        break;
                        }
                }
            }
            QUERY=sinPeso;
        }
//        System.out.println(QUERY);
        StringTokenizer tokenArroba= new StringTokenizer(QUERY,"@");
        if(tokenArroba.hasMoreTokens()){
            sinArroba=tokenArroba.nextToken().toString();
        }
        if(QUERY.contains("@")){
            while(tokenArroba.hasMoreTokens()){
                sinArroba=sinArroba+"-";
                String TEMP=tokenArroba.nextToken().toString();
                for (int i = 0; i < TEMP.getBytes().length; i++) {
                    if(!TEMP.substring(i,i+1).equals("{"))
                        if(!TEMP.substring(i,i+1).equals("}")){
                        sinArroba=sinArroba+TEMP.substring(i,i+1);
                        }else{
                        sinArroba=sinArroba+TEMP.substring(i+1,TEMP.getBytes().length);
                        break;
                        }
                }
            }
            _QUERY=sinArroba;
        }else
            _QUERY=QUERY;
        
        if(b)
            return _QUERY.replaceAll("_FECHA_INICIAL"," ? ").replaceAll("_FECHA_CORTE"," ? ");
        else
            return _QUERY;
    }
}
